﻿using _04.Net8Cache.Application;
using _04.Net8Cache.Customs;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Caching.StackExchangeRedis;
using Microsoft.Extensions.DependencyInjection;
using System.Text;

namespace _04.Net8Cache
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");

            #region 1\创建MemoryCache本地存储
            {
                //// 1、创建数据
                //string data = "数据库";
                //string data_key = "data_key";
                //// 2、创建缓存接口
                //MemoryCacheOptions cacheOptions = new MemoryCacheOptions();
                //IMemoryCache cache = new MemoryCache(cacheOptions);
                //// 3、储存数据
                //cache.Set<string>(data_key, data);
                //// 4、取数据
                //var dataGet = cache.Get<string>(data_key);
                //Console.WriteLine($"dataGet:{dataGet}");
            }
            #endregion

            #region 2、数据储存到Redis
            {
                // 1、创建数据
                //string data = "数据库redis";
                //string data_key = "data_key";
                //// 2、创建缓存接口
                //RedisCacheOptions redisCache = new RedisCacheOptions();
                //redisCache.Configuration = "localhost:6379";
                //IDistributedCache cache = new RedisCache(redisCache);
                //// 3、储存数据
                //cache.SetString(data_key, data);
                //// 4、取数据
                //var dataGet = cache.GetString(data_key);
                //Console.WriteLine($"dataGet:{dataGet}");

            }
            #endregion

            #region 3、缓存自定义-字典储存
            //{
            //    //1、创建数据
            //    string data = "数据库redisCustom";
            //    string data_key = "data_key";
            //    // 2、创建缓存接口
            //    IDistributedCache redisCache = new CustomCache();

            //    // 3、储存数据
            //    byte[] bytes= Encoding.UTF8.GetBytes(data);
            //    redisCache.Set(data_key, bytes);
            //    // 4、取数据
            //    byte[] byteGets = redisCache.Get(data_key);
            //    var dataGet = Encoding.UTF8.GetString(bytes);
            //    Console.WriteLine($"dataGet:{dataGet}");

            //}
            #endregion

            #region 4、缓存自定义 数据存储到MySQL
            //{
                ////1、创建数据
                //string data = "数据库redisCustom";
                //string data_key = "data_key";
                //// 2、创建缓存接口
                //CustomCacheOptions customCache = new CustomCacheOptions();
                //customCache._connectionString = "server=localhost;database=fu;user=root;password=root;";
                //IDistributedCache redisCache = new CustomCacheMySQL(customCache);

                //// 3、储存数据
                //byte[] bytes = Encoding.UTF8.GetBytes(data);
                //redisCache.Set(data_key, bytes);
                //// 4、取数据
                //byte[] byteGets = redisCache.Get(data_key);
                //var dataGet = Encoding.UTF8.GetString(bytes);
                //Console.WriteLine($"dataGet:{dataGet}");

            //}
            #endregion

            #region 5、缓存大小
            //{
            //    // 1、创建数据
            //    string data = "数据库";
            //    string data_key = "data_key";
            //    // 2、创建缓存接口
            //    MemoryCacheOptions cacheOptions = new MemoryCacheOptions();
            //    cacheOptions.SizeLimit = 2; // 设置缓存大小
            //    IMemoryCache cache = new MemoryCache(cacheOptions);

            //    MemoryCacheEntryOptions memoryCacheEntryOptions = new MemoryCacheEntryOptions();
            //    memoryCacheEntryOptions.SetSize(1); // 缓存占用数据大小
            //    // 3、储存数据
            //    cache.Set<string>(data_key, data, memoryCacheEntryOptions);
            //    cache.Set<string>("data_key1", "数据库1", memoryCacheEntryOptions);
            //    cache.Set<string>("data_key2", "数据库2", memoryCacheEntryOptions);
            //    cache.Set<string>("data_key3", "数据库3", memoryCacheEntryOptions);
            //    // 4、取数据
            //    var dataGet = cache.Get<string>(data_key);
            //    var dataGet1 = cache.Get<string>("data_key1");
            //    var dataGet2 = cache.Get<string>("data_key2");
            //    var dataGet3 = cache.Get<string>("data_key3");
            //    Console.WriteLine($"dataGet:{dataGet}");
            //    Console.WriteLine($"dataGet1:{dataGet1}");
            //    Console.WriteLine($"dataGet2:{dataGet2}");
            //    Console.WriteLine($"dataGet3:{dataGet3}");
            //}
            #endregion

            #region 6、缓存时间
            //{
            //    // 1、创建数据
            //    string data = "数据库";
            //    string data_key = "data_key";
            //    // 2、创建缓存接口
            //    MemoryCacheOptions cacheOptions = new MemoryCacheOptions();
            //    //cacheOptions.SizeLimit = 2; // 设置缓存大小
            //    IMemoryCache cache = new MemoryCache(cacheOptions);

            //    MemoryCacheEntryOptions memoryCacheEntryOptions = new MemoryCacheEntryOptions();
            //    memoryCacheEntryOptions.SetSize(1); // 缓存占用数据大小
            //    //memoryCacheEntryOptions.SetAbsoluteExpiration(TimeSpan.FromSeconds(5)); // 设置固定时间
            //    memoryCacheEntryOptions.SetSlidingExpiration(TimeSpan.FromSeconds(5)); // 设置滑动时间
            //    // 3、储存数据
            //    cache.Set<string>(data_key, data, memoryCacheEntryOptions);

            //    // 4、取数据
            //    var dataGet = cache.Get<string>(data_key);
            //    Thread.Sleep(4 * 1000);
            //    var dataGet1 = cache.Get<string>(data_key);
            //    Thread.Sleep(4 * 1000);
            //    var dataGet2 = cache.Get<string>(data_key);
            //    var dataGet3 = cache.Get<string>(data_key);
            //    Console.WriteLine($"dataGet:{dataGet}");
            //    Console.WriteLine($"dataGet1:{dataGet1}");
            //    Console.WriteLine($"dataGet2:{dataGet2}");
            //    Console.WriteLine($"dataGet3:{dataGet3}");
            //}
            #endregion

            #region 7、并发缓存
            //{
            //    // 1、创建数据
            //    string data = "数据库";
            //    string data_key = "data_key";
            //    // 2、创建缓存接口
            //    MemoryCacheOptions cacheOptions = new MemoryCacheOptions();
            //    //cacheOptions.SizeLimit = 2; // 设置缓存大小
            //    IMemoryCache cache = new MemoryCache(cacheOptions);

            //    MemoryCacheEntryOptions memoryCacheEntryOptions = new MemoryCacheEntryOptions();
            //    memoryCacheEntryOptions.SetSize(1); // 缓存占用数据大小
            //    //memoryCacheEntryOptions.SetAbsoluteExpiration(TimeSpan.FromSeconds(5)); // 设置固定时间
            //    memoryCacheEntryOptions.SetSlidingExpiration(TimeSpan.FromSeconds(5)); // 设置滑动时间
            //    // 3、储存数据
            //    cache.Set<string>(data_key, data, memoryCacheEntryOptions);

            //    // 4、取数据
            //    Parallel.For(1, 5, (a) => {

            //        cache.TryGetValue<string>(data_key, out string dataValue);
            //        Console.WriteLine($"dataGet:{dataValue}");
            //    });
            //}
            #endregion

            #region 8、缓存使用
            {
                // 1、创建IOC容器
                IServiceCollection services = new ServiceCollection();

                // 2、添加缓存组件
                services.AddMemoryCache(options => {
                    options.SizeLimit = 4;
                });

                // 3、添加ProductService
                services.AddSingleton<ProductService>();

                ProductService productService = services.BuildServiceProvider().GetRequiredService<ProductService>();
                List<Product> products = productService.GetProduct();
                List<Product> product1s = productService.GetProduct();
                List<Product> product2s = productService.GetProduct();
            }
            #endregion
            Console.ReadKey();
        }
    }
}
